#include "work.h"
#include "peripheral.h"
#include "timer.h"
#include "lpuart.h"
#include "flash.h"
#include "temp.h"
#include "basic.h"
#include "lpm.h"
#include "atim3.h"

uint8_t ms10_cnt1;
uint8_t  load_cnt, unload_cnt;	// 负载检测 时间

uint8_t Work_Mode=0,Work_Strength=0,Input_Voltage_State, bat_low_flag;
uint8_t Adapt_Duty,Adapt_Max_Duty,Trigger_State,efficiency_value;
uint8_t ms10_cnt,time_cnt;
uint8_t Ems_Duty=100,EMS_MAXDuty=100,Beep_Time=0,beep_cnt;
// uint16_t off_cnt1,sleep_cnt=0;
// uint16_t err_to_sleep_cnt = 0;
uint16_t Current_Voltage,Last_Voltage;
uint16_t Trigger_Count1=0;
uint8_t input_cnt,pwm_period=0;
boolean_t load_f=0; 
boolean_t beep_f=0,ems_f=0;
boolean_t age_mode=0,life_mode=0,flash_init=0;
extern uint8_t power_cnt,Current_Temp,flash_cnt1,lv_cnt1,lv_cnt,flash_cnt;
extern boolean_t ms10_f1,ms10_f3,Debug_Mode,Temp_Error;
extern boolean_t Fan_Error,flash_f;
extern uint8_t Charge_State;

float EMS_LOAD_V=0;
uint32_t ulTemp;

// ems 用到的变量*******************************
uint8_t phase_cnt = 0;

uint16_t sub_period; // 两个ems脉冲之间的间隔（125us）
uint16_t  period_cnt;
uint8_t period_cnt1;

uint8_t unit1_time, unit2_time, unit3_time, unit4_time, unit5_time;
uint8_t unit6_time, unit7_time, unit8_time, unit9_time, unit10_time, unit11_time;

uint16_t  unit1_duty, unit2_duty, unit3_duty, unit4_duty, unit5_duty;
uint16_t  unit6_duty, unit7_duty, unit8_duty, unit9_duty, unit10_duty, unit11_duty;

uint16_t unit1_period, unit2_period, unit3_period, unit4_period, unit5_period;
uint16_t unit6_period, unit7_period, unit8_period, unit9_period, unit10_period, unit11_period;

uint16_t sub1_period, sub2_period, sub3_period, sub4_period, sub5_period;
uint16_t sub6_period, sub7_period, sub8_period, sub9_period, sub10_period, sub11_period;

// 第一个周期运行完毕flag
uint8_t mode2_first_loop_flag, mode3_first_loop_flag, mode4_first_loop_flag;
uint8_t combo_waves_repeat_cnt = 0;

// uint8_t charge_delay2 = 0, charge_delay1 = 0, charge_delay = 0;
// uint16_t  chage_full_delay, charge_full_flag;


uint16_t unit_period, unit_duty, sub_duty;
uint8_t repeat_time, phase_time;

uint8_t last_level = 0xff;
uint8_t last_mode = 0xff;
uint8_t level_adjust_delay;
uint8_t mode_change_delay;
uint8_t level_max_pwm_period;

uint8_t vems_pwm_duty[8] = {65, 70, 70, 70, 80, 80, 80, 80};		// 升压占空比
// uint8_t level_pwm_period[8] = {3, 4, 5, 9, 17, 23, 33, 45};
// uint8_t level_pwm_period[8] = {15, 20, 25, 30, 37, 38, 40, 45};		// 升压持续时间--档位对应的电压在这里改动
uint8_t level_pwm_period[8] =     {4, 8, 15, 20, 28, 35, 42, 50};		// 升压持续时间--档位对应的电压在这里改动

#define MODE4_waves_1		1
#define MODE4_waves_2		2
#define MODE4_waves_3		3
#define MODE4_waves_4		4
#define MAX_WAVES_CNT		5

#define MODE4_WAVES_SELECT  MODE4_waves_2

#define ALL_MODE_WAVES_SELECT  MODE4_waves_1

/****************************************************************************
 * ems 脉冲统计
 *  sub1_period=25*8;  == 40hz
 *  sub1_period = 15;	      // 脉冲间隔大约为：15*125us ==2ms左右==500hz
 * 
 *  unit1_period = 100;       // 本次波形总周期 100*10ms = 1s
	unit1_duty = 10;		  //  本周期中，ems输出的时间 10* 10ms ==100ms	
	unit1_time = 0;
 *  体感统计：
	20ms的周期，输出对应的电压较低，体感很弱，仅酥麻感
	30ms的周期，输出对应的电压，体感较弱，体感略微增强
	40ms的周期
	50ms的周期，有较强的拉动肌肉的感觉
	60ms的周期
	70ms
	80ms  

	200ms周期，体感非常强，拉疼皮肤


**********************************************************************************/

void Work_Handler()
{
	uint32_t AD_Result;

	uint16_t sub1_duty, sub2_duty, sub3_duty, sub4_duty, sub5_duty, sub6_duty;
	uint16_t sub7_duty, sub8_duty, sub9_duty, sub10_duty, sub11_duty, sub12_duty;


	if(Work_Mode)
	{
		// EN_EMS_ON;
		switch(Work_Mode)
		{
				//10V~40V����200R
			case 1:	
				phase_time=2;
				sub1_period=25*8;			// 40hz
				sub1_duty=0;
				unit1_period=150;			// 输出1000ms + 暂停500ms， 重复23次 ---大约30s 
				unit1_duty=100;
				unit1_time=23;

				sub2_period=25*8;
				sub2_duty=0;
				unit2_period=200;           // 输出1500ms + 暂停500ms， 重复17次 ---大约34s 
				unit2_duty=150;
				unit2_time=17;
	
				sub3_period=25*8;
				sub3_duty=0;
				unit3_period=300;          // 输出2500ms + 暂停500ms， 重复11次 ---大约33s
				unit3_duty=250;
				unit3_time=11;

				break;

			case 2:
#if(MAX_WAVES_CNT == ALL_MODE_WAVES_SELECT)
			phase_time = 10;
			// 1. 开机阶段： 5hz频率输出6s + 50hz波形（输出4s，暂停2s）重复3次。（此后不再重复）
			sub1_period = 50*8;    	// 20ms  -----频率 50hz
			sub1_duty = 0;
			unit1_period = 100;
			unit1_duty = 80;
			unit1_time = 1;

			sub2_period = 55*8; 		// 周期 200ms -----频率 5hz ---体感特强，肌肉跳动
			sub2_duty = 0;
			unit2_period = 100;
			unit2_duty = 80;
			unit2_time = 0;

			//  2. 50hz频率  （输出4s+暂停4s）重复2次
			sub3_period = 20*8;    	// 20ms  -----频率 50hz
			sub3_duty = 0;
			unit3_period = 300;
			unit3_duty = 250;
			unit3_time = 1;

			// 3. 25hz频率  （输出6s +暂停4s）重复2次 ----这个频率测不到ems负载情况
			sub4_period = 40*8;    	// 40ms  -----频率 25hz
			sub4_duty = 0;
			unit4_period = 400;
			unit4_duty = 350;
			unit4_time = 1;

			//4. 50hz频率  （输出4s+暂停4s）重复2次
			sub5_period = 50*8;    	// 20ms  -----频率 50hz
			sub5_duty = 0;
			unit5_period = 500;
			unit5_duty = 400;
			unit5_time = 1;
			//5. 短周期脉冲 ， 脉冲间隔16ms，脉冲3次，---间隔240ms，发送3次脉冲。 一共持续30s
			sub6_period = 55*8;    	// 16ms  -----频率 50hz
			sub6_duty = 0;
			unit6_period = 100;
			unit6_duty = 80;
			unit6_time = 2;
			// 6. 长周期脉冲 ， 脉冲间隔8ms，脉冲3次，---间隔 600ms，发送3次脉冲。 一共持续5s
			sub7_period = 50*8;    	// 8ms  -----频率 50hz
			sub7_duty = 0;
			unit7_period = 200;
			unit7_duty = 200;
			unit7_time = 1;
			// 7. 短周期脉冲 ， 脉冲间隔16ms，脉冲3次，---间隔240ms，发送3次脉冲。 一共持续10s
			sub8_period = 40*8;    	// 16ms  -----频率 50hz
			sub8_duty = 0;
			unit8_period = 50;
			unit8_duty = 40;
			unit8_time = 5;
			//8. 长周期脉冲 ， 脉冲间隔8ms，脉冲3次，---间隔600ms，发送3次脉冲。 一共持续15s
			sub9_period = 30*8;    	// 16ms  -----频率 50hz
			sub9_duty = 0;
			unit9_period = 100;
			unit9_duty = 80;
			unit9_time = 5;
			// 10,  短周期脉冲 ， 脉冲间隔16ms，脉冲3次，---间隔240ms，发送3次脉冲。 一共持续6s 
			//                     +50hz频率  （输出4s+暂停4s） 重复3次
			sub10_period = 20*8;    	// 16ms  -----频率 50hz
			sub10_duty = 0;
			unit10_period = 30;
			unit10_duty = 5;
			unit10_time = 20;

			sub11_period = 40*8;    	// 20ms  -----频率 50hz
			sub11_duty = 0;
			unit11_period = 500;
			unit11_duty = 400;
			unit11_time = 0;


#else 			
				phase_time=1;
	
				sub1_period=50*8;		 // 样机参考波形，第一个循环是 1个22hz波形 + 1个 11hz波形， 后续为3个22hz波形 + 1个11hz波形 
				sub1_duty=0;
				unit1_period=800;
				unit1_duty=700;
				unit1_time=0;
				if(mode2_first_loop_flag){
					unit1_time = 2;
				}
				
	
				sub2_period=100*8; // 11hz
				sub2_duty=0;
				unit2_period=400;
				unit2_duty=300;
				unit2_time=5;

				sub3_period=25*8; // 11hz
				sub3_duty=0;
				unit3_period=400;
				unit3_duty=350;
				unit3_time=5;
#endif				
				break;	
			case 3:	
#if(MAX_WAVES_CNT == ALL_MODE_WAVES_SELECT)
			phase_time = 10;
			// 1. 开机阶段： 5hz频率输出6s + 50hz波形（输出4s，暂停2s）重复3次。（此后不再重复）
			sub1_period = 50*8;    	// 50ms周期，有体感
			sub1_duty = 0;
			unit1_period = 100;
			unit1_duty = 80;
			unit1_time = 1;

			sub2_period = 60*8; 	// 50ms周期，有体感
			sub2_duty = 0;
			unit2_period = 100;
			unit2_duty = 80;
			unit2_time = 0;

			//  2. 50hz频率  （输出4s+暂停4s）重复2次
			sub3_period = 20*8;    	// 20ms  -----体感较弱，酥麻感
			sub3_duty = 0;
			unit3_period = 300;
			unit3_duty = 250;
			unit3_time = 1;

			// 3. 25hz频率  （输出6s +暂停4s）重复2次 ----这个频率测不到ems负载情况
			sub4_period = 50*8;    	// 40ms  -----频率 25hz
			sub4_duty = 0;
			unit4_period = 400;
			unit4_duty = 350;
			unit4_time = 1;

			//4. 50hz频率  （输出4s+暂停4s）重复2次
			sub5_period = 55*8;    	// 20ms  -----频率 50hz
			sub5_duty = 0;
			unit5_period = 500;
			unit5_duty = 400;
			unit5_time = 1;
			//5. 短周期脉冲 ， 脉冲间隔16ms，脉冲3次，---间隔240ms，发送3次脉冲。 一共持续30s
			sub6_period = 60*8;    	// 16ms  -----频率 50hz
			sub6_duty = 0;
			unit6_period = 100;
			unit6_duty = 80;
			unit6_time = 2;
			// 6. 长周期脉冲 ， 脉冲间隔8ms，脉冲3次，---间隔 600ms，发送3次脉冲。 一共持续5s
			sub7_period = 50*8;    	// 8ms  -----频率 50hz
			sub7_duty = 0;
			unit7_period = 200;
			unit7_duty = 200;
			unit7_time = 1;
			// 7. 短周期脉冲 ， 脉冲间隔16ms，脉冲3次，---间隔240ms，发送3次脉冲。 一共持续10s
			sub8_period = 55*8;    	// 16ms  -----频率 50hz
			sub8_duty = 0;
			unit8_period = 50;
			unit8_duty = 40;
			unit8_time = 1;
			//8. 长周期脉冲 ， 脉冲间隔8ms，脉冲3次，---间隔600ms，发送3次脉冲。 一共持续15s
			sub9_period = 30*8;    	// 16ms  -----频率 50hz
			sub9_duty = 0;
			unit9_period = 100;
			unit9_duty = 80;
			unit9_time = 5;
			// 10,  短周期脉冲 ， 脉冲间隔16ms，脉冲3次，---间隔240ms，发送3次脉冲。 一共持续6s 
			//                     +50hz频率  （输出4s+暂停4s） 重复3次
			sub10_period = 20*8;    	// 16ms  -----频率 50hz
			sub10_duty = 0;
			unit10_period = 30;
			unit10_duty = 5;
			unit10_time = 20;

			sub11_period = 50*8;    	// 20ms  -----频率 50hz
			sub11_duty = 0;
			unit11_period = 500;
			unit11_duty = 400;
			unit11_time = 0;


#else 

				phase_time=3;
	

				sub1_period=40*8;			// 40hz
				sub1_duty=0;
				unit1_period=150;			// 输出1000ms + 暂停500ms， 重复23次 ---大约30s 
				unit1_duty=100;
				unit1_time=5;

				sub2_period=20*8;
				sub2_duty=0;
				unit2_period=200;           // 输出1500ms + 暂停500ms， 重复17次 ---大约34s 
				unit2_duty=150;
				unit2_time=20;
	
				sub3_period=50*8;
				sub3_duty=0;
				unit3_period=200;          // 输出2500ms + 暂停500ms， 重复11次 ---大约33s
				unit3_duty=150;
				unit3_time=2;

				sub4_period=25*8;
				sub4_duty=0;
				unit4_period=200;           // 输出1500ms + 暂停500ms， 重复17次 ---大约34s 
				unit4_duty=150;
				unit4_time=20;
#endif				
				break;
#if 0
			case 2:
#if(MAX_WAVES_CNT == ALL_MODE_WAVES_SELECT)
			phase_time = 10;
			// 1. 开机阶段： 5hz频率输出6s + 50hz波形（输出4s，暂停2s）重复3次。（此后不再重复）
			sub1_period = 50*8;    	// 20ms  -----频率 50hz
			sub1_duty = 0;
			unit1_period = 100;
			unit1_duty = 80;
			unit1_time = 1;

			sub2_period = 55*8; 		// 周期 200ms -----频率 5hz ---体感特强，肌肉跳动
			sub2_duty = 0;
			unit2_period = 100;
			unit2_duty = 80;
			unit2_time = 0;

			//  2. 50hz频率  （输出4s+暂停4s）重复2次
			sub3_period = 20*8;    	// 20ms  -----频率 50hz
			sub3_duty = 0;
			unit3_period = 300;
			unit3_duty = 250;
			unit3_time = 1;

			// 3. 25hz频率  （输出6s +暂停4s）重复2次 ----这个频率测不到ems负载情况
			sub4_period = 40*8;    	// 40ms  -----频率 25hz
			sub4_duty = 0;
			unit4_period = 400;
			unit4_duty = 350;
			unit4_time = 1;

			//4. 50hz频率  （输出4s+暂停4s）重复2次
			sub5_period = 50*8;    	// 20ms  -----频率 50hz
			sub5_duty = 0;
			unit5_period = 500;
			unit5_duty = 400;
			unit5_time = 1;
			//5. 短周期脉冲 ， 脉冲间隔16ms，脉冲3次，---间隔240ms，发送3次脉冲。 一共持续30s
			sub6_period = 55*8;    	// 16ms  -----频率 50hz
			sub6_duty = 0;
			unit6_period = 100;
			unit6_duty = 80;
			unit6_time = 2;
			// 6. 长周期脉冲 ， 脉冲间隔8ms，脉冲3次，---间隔 600ms，发送3次脉冲。 一共持续5s
			sub7_period = 50*8;    	// 8ms  -----频率 50hz
			sub7_duty = 0;
			unit7_period = 200;
			unit7_duty = 200;
			unit7_time = 1;
			// 7. 短周期脉冲 ， 脉冲间隔16ms，脉冲3次，---间隔240ms，发送3次脉冲。 一共持续10s
			sub8_period = 40*8;    	// 16ms  -----频率 50hz
			sub8_duty = 0;
			unit8_period = 50;
			unit8_duty = 40;
			unit8_time = 5;
			//8. 长周期脉冲 ， 脉冲间隔8ms，脉冲3次，---间隔600ms，发送3次脉冲。 一共持续15s
			sub9_period = 30*8;    	// 16ms  -----频率 50hz
			sub9_duty = 0;
			unit9_period = 100;
			unit9_duty = 80;
			unit9_time = 5;
			// 10,  短周期脉冲 ， 脉冲间隔16ms，脉冲3次，---间隔240ms，发送3次脉冲。 一共持续6s 
			//                     +50hz频率  （输出4s+暂停4s） 重复3次
			sub10_period = 20*8;    	// 16ms  -----频率 50hz
			sub10_duty = 0;
			unit10_period = 30;
			unit10_duty = 5;
			unit10_time = 20;

			sub11_period = 40*8;    	// 20ms  -----频率 50hz
			sub11_duty = 0;
			unit11_period = 500;
			unit11_duty = 400;
			unit11_time = 0;


#else 			
				phase_time=1;
	
				sub1_period=50*8;		 // 样机参考波形，第一个循环是 1个22hz波形 + 1个 11hz波形， 后续为3个22hz波形 + 1个11hz波形 
				sub1_duty=0;
				unit1_period=4000;
				unit1_duty=3800;
				unit1_time=0;
				if(mode2_first_loop_flag){
					unit1_time = 2;
				}
				
	
				sub2_period=100*8; // 11hz
				sub2_duty=0;
				unit2_period=4000;
				unit2_duty=3800;
				unit2_time=0;
#endif				
				break;

			case 3:
#if(MAX_WAVES_CNT == ALL_MODE_WAVES_SELECT)

			phase_time = 10;
			
			sub1_period = 50*8;    	// 20ms  -----频率 50hz
			sub1_duty = 0;
			unit1_period = 100;
			unit1_duty = 80;
			unit1_time = 1;

			sub2_period = 55*8; 		// 周期 200ms -----频率 5hz ---体感特强，肌肉跳动
			sub2_duty = 0;
			unit2_period = 100;
			unit2_duty = 80;
			unit2_time = 0;

			//  2. 50hz频率  （输出4s+暂停4s）重复2次
			sub3_period = 15*8;    	// 20ms  -----频率 50hz
			sub3_duty = 0;
			unit3_period = 300;
			unit3_duty = 250;
			unit3_time = 1;

			// 3. 25hz频率  （输出6s +暂停4s）重复2次 ----这个频率测不到ems负载情况
			sub4_period = 20*8;    	// 40ms  -----频率 25hz
			sub4_duty = 0;
			unit4_period = 400;
			unit4_duty = 350;
			unit4_time = 1;

			//4. 50hz频率  （输出4s+暂停4s）重复2次
			sub5_period = 40*8;    	// 20ms  -----频率 50hz
			sub5_duty = 0;
			unit5_period = 500;
			unit5_duty = 400;
			unit5_time = 1;
			//5. 短周期脉冲 ， 脉冲间隔16ms，脉冲3次，---间隔240ms，发送3次脉冲。 一共持续30s
			sub6_period = 50*8;    	// 16ms  -----频率 50hz
			sub6_duty = 0;
			unit6_period = 100;
			unit6_duty = 80;
			unit6_time = 2;
			// 6. 长周期脉冲 ， 脉冲间隔8ms，脉冲3次，---间隔 600ms，发送3次脉冲。 一共持续5s
			sub7_period = 55*8;    	// 8ms  -----频率 50hz
			sub7_duty = 0;
			unit7_period = 200;
			unit7_duty = 200;
			unit7_time = 1;
			// 7. 短周期脉冲 ， 脉冲间隔16ms，脉冲3次，---间隔240ms，发送3次脉冲。 一共持续10s
			sub8_period = 60*8;    	// 16ms  -----频率 50hz
			sub8_duty = 0;
			unit8_period = 50;
			unit8_duty = 40;
			unit8_time = 5;
			//8. 长周期脉冲 ， 脉冲间隔8ms，脉冲3次，---间隔600ms，发送3次脉冲。 一共持续15s
			sub9_period = 65*8;    	// 16ms  -----频率 50hz
			sub9_duty = 0;
			unit9_period = 100;
			unit9_duty = 80;
			unit9_time = 5;
			// 10,  短周期脉冲 ， 脉冲间隔16ms，脉冲3次，---间隔240ms，发送3次脉冲。 一共持续6s 
			//                     +50hz频率  （输出4s+暂停4s） 重复3次
			sub10_period = 60*8;    	// 16ms  -----频率 50hz
			sub10_duty = 0;
			unit10_period = 30;
			unit10_duty = 5;
			unit10_time = 20;

			sub11_period = 55*8;    	// 20ms  -----频率 50hz
			sub11_duty = 0;
			unit11_period = 500;
			unit11_duty = 400;
			unit11_time = 0;

#else 				
				phase_time=1;
				// 样机参考波形，第一个循环是 2个50hz波形 + 2个 25hz波形， 后续为4个50hz波形 + 2个25hz波形 
				sub1_period=20*8;	// 50hz 波形输出3s，暂停2秒
				sub1_duty=0;
				unit1_period=500;
				unit1_duty=300;
				if(mode3_first_loop_flag == 0){
					unit1_time=1;
				}
				else{
					unit1_time=3;
				}
				
				
				sub2_period=40*8;  // 25hz 波形输出5s，暂停2秒
				sub2_duty=0;
				unit2_period=700; 
				unit2_duty=500;
				unit2_time=1;
	
				sub3_period=15*8;  //15ms== 66hz
				sub3_duty=0;
				unit3_period=500;
				unit3_duty=300;
				unit3_time=1;
#endif				
				break;
#endif				
			case 4:
				/********************************************************************************
				 * 模式4参考样机模式7，该模式为组合波形
				 * 1. 开机阶段： 5hz频率输出6s + 50hz波形（输出4s，暂停2s）重复3次。（此后不再重复）
				 * 2. 50hz频率  （输出4s+暂停4s）重复2次
				 * 3. 25hz频率  （输出6s +暂停4s）重复2次
				 * 4. 50hz频率  （输出4s+暂停4s）重复2次
				 * 5. 短周期脉冲 ， 脉冲间隔16ms，脉冲3次，---间隔240ms，发送3次脉冲。 一共持续30s
				 * 6. 长周期脉冲 ， 脉冲间隔8ms，脉冲3次，---间隔 600ms，发送3次脉冲。 一共持续5s
				 * 7. 短周期脉冲 ， 脉冲间隔16ms，脉冲3次，---间隔240ms，发送3次脉冲。 一共持续10s
				 * 8. 长周期脉冲 ， 脉冲间隔8ms，脉冲3次，---间隔600ms，发送3次脉冲。 一共持续15s
				 * 9. 最低频脉冲                                  ，一共持续4s  +50hz频率  （输出4s+暂停4s）重复2次
				 * 10,  短周期脉冲 ， 脉冲间隔16ms，脉冲3次，---间隔240ms，发送3次脉冲。 一共持续6s +1个 50hz频率  （输出4s+暂停4s） 重复3次
				 * 
				*****************************************************************************************/
				if(0 == mode4_first_loop_flag){
					phase_time = 1;
				}
				else{
					phase_time = 10;
				}
				

#if 0			// 李茂版本
				sub1_period=85*8; 		// 周期 85ms ---频率约为12.5hz
				sub1_duty=0;
				unit1_period=500;
				unit1_duty=300;
				unit1_time=2;
	
				sub2_period=20*8;    	// 20ms  -----频率 50hz
				sub2_duty=0;
				unit2_period=60;
				unit2_duty=5;
				unit2_time=30;
	
				sub3_period=200*8;		// 200ms -----频率 5hz
				sub3_duty=0;
				unit3_period=2000;
				unit3_duty=1800;
				unit3_time=1;
#else

#if (MODE4_WAVES_SELECT == MODE4_waves_1)
		// 1. 开机阶段： 5hz频率输出6s + 50hz波形（输出4s，暂停2s）重复3次。（此后不再重复）
		sub1_period = 20*8;    	// 20ms 周期  输出的幅值电压较低，体感较弱，仅酥麻感
		sub1_duty = 0;
		unit1_period = 100;
		unit1_duty = 80;
		unit1_time = 1;

		sub2_period = 50*8; 		// 周期 200ms -----频率 5hz ---体感特强，肌肉跳动
		sub2_duty = 0;
		unit2_period = 200;
		unit2_duty = 200;
		unit2_time = 0;

		//  2. 50hz频率  （输出4s+暂停4s）重复2次
		sub3_period = 20*8;    	// 20ms  -----频率 50hz
		sub3_duty = 0;
		unit3_period = 800;
		unit3_duty = 700;
		unit3_time = 1;

		// 3. 25hz频率  （输出6s +暂停4s）重复2次 ----这个频率测不到ems负载情况
		sub4_period = 40*8;    	// 40ms  -----频率 25hz
		sub4_duty = 0;
		unit4_period = 800;
		unit4_duty = 700;
		unit4_time = 1;

		//4. 50hz频率  （输出4s+暂停4s）重复2次
		sub5_period = 20*8;    	// 20ms  -----频率 50hz
		sub5_duty = 0;
		unit5_period = 500;
		unit5_duty = 400;
		unit5_time = 1;
		//5. 短周期脉冲 ， 脉冲间隔16ms，脉冲3次，---间隔240ms，发送3次脉冲。 一共持续30s
		sub6_period = 40*8;    	// 16ms  -----频率 50hz
		sub6_duty = 0;
		unit6_period = 100;
		unit6_duty = 100;
		unit6_time = 2;
		// 6. 长周期脉冲 ， 脉冲间隔8ms，脉冲3次，---间隔 600ms，发送3次脉冲。 一共持续5s
		sub7_period = 55*8;    	// 8ms  -----频率 50hz
		sub7_duty = 0;
		unit7_period = 200;
		unit7_duty = 200;
		unit7_time = 1;
		// 7. 短周期脉冲 ， 脉冲间隔16ms，脉冲3次，---间隔240ms，发送3次脉冲。 一共持续10s
		sub8_period = 70*8;    	// 16ms  -----频率 50hz
		sub8_duty = 0;
		unit8_period = 50;
		unit8_duty = 40;
		unit8_time = 1;
		//8. 长周期脉冲 ， 脉冲间隔8ms，脉冲3次，---间隔600ms，发送3次脉冲。 一共持续15s
		sub9_period = 30*8;    	// 16ms  -----频率 50hz
		sub9_duty = 0;
		unit9_period = 100;
		unit9_duty = 80;
		unit9_time = 5;
		// 10,  短周期脉冲 ， 脉冲间隔16ms，脉冲3次，---间隔240ms，发送3次脉冲。 一共持续6s 
		//                     +50hz频率  （输出4s+暂停4s） 重复3次
		sub10_period = 20*8;    	// 16ms  -----频率 50hz
		sub10_duty = 0;
		unit10_period = 30;
		unit10_duty = 5;
		unit10_time = 20;

		sub11_period = 50*8;    	// 20ms  -----频率 50hz
		sub11_duty = 0;
		unit11_period = 500;
		unit11_duty = 400;
		unit11_time = 0;
#elif(MODE4_WAVES_SELECT == MODE4_waves_2)
		// 1. 开机阶段： 5hz频率输出6s + 50hz波形（输出4s，暂停2s）重复3次。（此后不再重复）
		sub1_period = 20*8;    	// 20ms  -----频率 50hz
		sub1_duty = 0;
		unit1_period = 100;
		unit1_duty = 80;
		unit1_time = 1;

		sub2_period = 50*8; 		// 周期 200ms -----频率 5hz ---体感特强，肌肉跳动
		sub2_duty = 0;
		unit2_period = 200;
		unit2_duty = 200;
		unit2_time = 0;

		//  2. 50hz频率  （输出4s+暂停4s）重复2次
		sub3_period = 20*8;    	// 20ms  -----频率 50hz
		sub3_duty = 0;
		unit3_period = 800;
		unit3_duty = 700;
		unit3_time = 1;

		// 3. 25hz频率  （输出6s +暂停4s）重复2次 ----这个频率测不到ems负载情况
		sub4_period = 40*8;    	// 40ms  -----频率 25hz
		sub4_duty = 0;
		unit4_period = 800;
		unit4_duty = 700;
		unit4_time = 1;

		//4. 50hz频率  （输出4s+暂停4s）重复2次
		sub5_period = 50*8;    	// 20ms  -----频率 50hz
		sub5_duty = 0;
		unit5_period = 500;
		unit5_duty = 400;
		unit5_time = 1;
		//5. 短周期脉冲 ， 脉冲间隔16ms，脉冲3次，---间隔240ms，发送3次脉冲。 一共持续30s
		sub6_period = 60*8;    	// 16ms  -----频率 50hz
		sub6_duty = 0;
		unit6_period = 100;
		unit6_duty = 100;
		unit6_time = 2;
		// 6. 长周期脉冲 ， 脉冲间隔8ms，脉冲3次，---间隔 600ms，发送3次脉冲。 一共持续5s
		sub7_period = 55*8;    	// 8ms  -----频率 50hz
		sub7_duty = 0;
		unit7_period = 200;
		unit7_duty = 200;
		unit7_time = 1;
		// 7. 短周期脉冲 ， 脉冲间隔16ms，脉冲3次，---间隔240ms，发送3次脉冲。 一共持续10s
		sub8_period = 50*8;    	// 16ms  -----频率 50hz
		sub8_duty = 0;
		unit8_period = 50;
		unit8_duty = 40;
		unit8_time = 1;
		//8. 长周期脉冲 ， 脉冲间隔8ms，脉冲3次，---间隔600ms，发送3次脉冲。 一共持续15s
		sub9_period = 40*8;    	// 16ms  -----频率 50hz
		sub9_duty = 0;
		unit9_period = 100;
		unit9_duty = 80;
		unit9_time = 5;
		// 10,  短周期脉冲 ， 脉冲间隔16ms，脉冲3次，---间隔240ms，发送3次脉冲。 一共持续6s 
		//                     +50hz频率  （输出4s+暂停4s） 重复3次
		sub10_period = 25*8;    	// 16ms  -----频率 50hz
		sub10_duty = 0;
		unit10_period = 30;
		unit10_duty = 5;
		unit10_time = 20;

		sub11_period = 50*8;    	// 20ms  -----频率 50hz
		sub11_duty = 0;
		unit11_period = 500;
		unit11_duty = 400;
		unit11_time = 0;
#elif(MODE4_WAVES_SELECT == MODE4_waves_3)
		// 1. 开机阶段： 5hz频率输出6s + 50hz波形（输出4s，暂停2s）重复3次。（此后不再重复）
		sub1_period = 20*8;    	// 20ms  -----频率 50hz
		sub1_duty = 0;
		unit1_period = 100;
		unit1_duty = 80;
		unit1_time = 1;

		sub2_period = 50*8; 		// 周期 200ms -----频率 5hz ---体感特强，肌肉跳动
		sub2_duty = 0;
		unit2_period = 200;
		unit2_duty = 200;
		unit2_time = 0;

		//  2. 50hz频率  （输出4s+暂停4s）重复2次
		sub3_period = 40*8;    	// 20ms  -----频率 50hz
		sub3_duty = 0;
		unit3_period = 800;
		unit3_duty = 700;
		unit3_time = 1;

		// 3. 25hz频率  （输出6s +暂停4s）重复2次 ----这个频率测不到ems负载情况
		sub4_period = 45*8;    	// 40ms  -----频率 25hz
		sub4_duty = 0;
		unit4_period = 800;
		unit4_duty = 700;
		unit4_time = 1;

		//4. 50hz频率  （输出4s+暂停4s）重复2次
		sub5_period = 50*8;    	// 20ms  -----频率 50hz
		sub5_duty = 0;
		unit5_period = 500;
		unit5_duty = 400;
		unit5_time = 1;
		//5. 短周期脉冲 ， 脉冲间隔16ms，脉冲3次，---间隔240ms，发送3次脉冲。 一共持续30s
		sub6_period = 55*8;    	// 16ms  -----频率 50hz
		sub6_duty = 0;
		unit6_period = 100;
		unit6_duty = 100;
		unit6_time = 2;
		// 6. 长周期脉冲 ， 脉冲间隔8ms，脉冲3次，---间隔 600ms，发送3次脉冲。 一共持续5s
		sub7_period = 60*8;    	// 8ms  -----频率 50hz
		sub7_duty = 0;
		unit7_period = 200;
		unit7_duty = 200;
		unit7_time = 1;
		// 7. 短周期脉冲 ， 脉冲间隔16ms，脉冲3次，---间隔240ms，发送3次脉冲。 一共持续10s
		sub8_period = 55*8;    	// 16ms  -----频率 50hz
		sub8_duty = 0;
		unit8_period = 100;
		unit8_duty = 80;
		unit8_time = 1;
		//8. 长周期脉冲 ， 脉冲间隔8ms，脉冲3次，---间隔600ms，发送3次脉冲。 一共持续15s
		sub9_period = 45*8;    	// 16ms  -----频率 50hz
		sub9_duty = 0;
		unit9_period = 100;
		unit9_duty = 80;
		unit9_time = 5;
		// 10,  短周期脉冲 ， 脉冲间隔16ms，脉冲3次，---间隔240ms，发送3次脉冲。 一共持续6s 
		//                     +50hz频率  （输出4s+暂停4s） 重复3次
		sub10_period = 35*8;    	// 16ms  -----频率 50hz
		sub10_duty = 0;
		unit10_period = 100;
		unit10_duty = 90;
		unit10_time = 5;

		sub11_period = 25*8;    	// 20ms  -----频率 50hz
		sub11_duty = 0;
		unit11_period = 500;
		unit11_duty = 400;
		unit11_time = 0;
#elif(MODE4_WAVES_SELECT == MODE4_waves_4)
		// 1. 开机阶段： 5hz频率输出6s + 50hz波形（输出4s，暂停2s）重复3次。（此后不再重复）
		sub1_period = 20*8;    	// 20ms  -----频率 50hz
		sub1_duty = 0;
		unit1_period = 100;
		unit1_duty = 80;
		unit1_time = 1;

		sub2_period = 50*8; 		// 周期 200ms -----频率 5hz ---体感特强，肌肉跳动
		sub2_duty = 0;
		unit2_period = 200;
		unit2_duty = 200;
		unit2_time = 0;

		//  2. 50hz频率  （输出4s+暂停4s）重复2次
		sub3_period = 20*8;    	// 20ms  -----频率 50hz
		sub3_duty = 0;
		unit3_period = 800;
		unit3_duty = 700;
		unit3_time = 1;

		// 3. 25hz频率  （输出6s +暂停4s）重复2次 ----这个频率测不到ems负载情况
		sub4_period = 40*8;    	// 40ms  -----频率 25hz
		sub4_duty = 0;
		unit4_period = 800;
		unit4_duty = 700;
		unit4_time = 1;

		//4. 50hz频率  （输出4s+暂停4s）重复2次
		sub5_period = 55*8;    	// 20ms  -----频率 50hz
		sub5_duty = 0;
		unit5_period = 500;
		unit5_duty = 400;
		unit5_time = 1;
		//5. 短周期脉冲 ， 脉冲间隔16ms，脉冲3次，---间隔240ms，发送3次脉冲。 一共持续30s
		sub6_period = 60*8;    	// 16ms  -----频率 50hz
		sub6_duty = 0;
		unit6_period = 100;
		unit6_duty = 100;
		unit6_time = 2;
		// 6. 长周期脉冲 ， 脉冲间隔8ms，脉冲3次，---间隔 600ms，发送3次脉冲。 一共持续5s
		sub7_period = 65*8;    	// 8ms  -----频率 50hz
		sub7_duty = 0;
		unit7_period = 200;
		unit7_duty = 200;
		unit7_time = 1;
		// 7. 短周期脉冲 ， 脉冲间隔16ms，脉冲3次，---间隔240ms，发送3次脉冲。 一共持续10s
		sub8_period = 60*8;    	// 16ms  -----频率 50hz
		sub8_duty = 0;
		unit8_period = 100;
		unit8_duty = 80;
		unit8_time = 1;
		//8. 长周期脉冲 ， 脉冲间隔8ms，脉冲3次，---间隔600ms，发送3次脉冲。 一共持续15s
		sub9_period = 55*8;    	// 16ms  -----频率 50hz
		sub9_duty = 0;
		unit9_period = 100;
		unit9_duty = 80;
		unit9_time = 5;
		// 10,  短周期脉冲 ， 脉冲间隔16ms，脉冲3次，---间隔240ms，发送3次脉冲。 一共持续6s 
		//                     +50hz频率  （输出4s+暂停4s） 重复3次
		sub10_period = 50*8;    	// 16ms  -----频率 50hz
		sub10_duty = 0;
		unit10_period = 30;
		unit10_duty = 5;
		unit10_time = 20;

		sub11_period = 40*8;    	// 20ms  -----频率 50hz
		sub11_duty = 0;
		unit11_period = 500;
		unit11_duty = 400;
		unit11_time = 0;
#endif

				

#endif

				break;
			default:
				break;
		}

		// 电压值，参考样机，档位改变后，电压从最低开始缓慢上升
		level_adjust_delay ++;
#if 0		
		switch(Work_Strength){
			case 0:{
				level_max_pwm_period = 1;	//=[2 max 20v] 
				break;	//
			}
			case 1:{
				level_max_pwm_period = 3; //  =[4 max 26v] 
				break;	//4=22V
			}
			
			case 2:{
				level_max_pwm_period = 5; //=[6 max 29v] 
				break;	
			}	
			case 3:{
				level_max_pwm_period = 9; //=[10 max 39v] 
				break;
			}
			case 4:{
				level_max_pwm_period = 17; // =[15 max 48v] 
				break;
			}
			case 5:{
				level_max_pwm_period = 23;// =[22 max 56v] 
				break;
			}
			case 6:{
				level_max_pwm_period = 33;//=[30 max 67v] 
				break;	
			}
			case 7:{
				level_max_pwm_period = 45;	//=[45 max 80v] 
				break;	//20=53V
			}
			default:break;
		}
#endif
		level_max_pwm_period = level_pwm_period[Work_Strength];
		// 200秒上升一次
		if((load_f)){
			// 档位 改变
			if(last_level != Work_Strength){
				last_level = Work_Strength;
				pwm_period = 0;
				period_cnt = 0;
			}
			if(level_adjust_delay %100 == 0){
				if(pwm_period < level_max_pwm_period){
					pwm_period ++;
				}
			}
		}
		// 模式改变
		if(last_mode != Work_Mode){
			load_f = 0;
			mode_change_delay ++;
			if(mode_change_delay > 100){		// 切换模式后，暂停500ms输出
				last_mode = Work_Mode;
			}
			else{
				return;
			}
			period_cnt = 0;
		}else{
			mode_change_delay = 0;
		}

		if(load_f == 0)		// 负载检测波形
		{
			phase_time = 0;
		
			sub1_period = 15;	// 脉冲间隔大约为：15*125us ==2ms左右==500hz
			sub1_duty = 0;
			unit1_period = 100;
			unit1_duty = 90;
			unit1_time = 0;
		
			EMS_MAXDuty = 2;
			pwm_period = 2;	// 负载不再线时，使用这个电压
		}

		// 几种 复合波形组合，交替出现
		switch(phase_cnt%(phase_time + 1))
		{
			case 0:				
				unit_period = unit1_period;
				unit_duty = unit1_duty;
				repeat_time = unit1_time;
				sub_period = sub1_period;
				sub_duty = sub1_duty;
				break;
			case 1:
				unit_period = unit2_period;
				unit_duty = unit2_duty;
				repeat_time = unit2_time;
				sub_period = sub2_period;
				sub_duty = sub2_duty;
				break;
			case 2:
				unit_period = unit3_period;
				unit_duty = unit3_duty;
				repeat_time = unit3_time;
				sub_period = sub3_period;
				sub_duty = sub3_duty;
				break;

			case 3:
				unit_period = unit4_period;
				unit_duty = unit4_duty;
				repeat_time = unit4_time;
				sub_period = sub4_period;
				sub_duty = sub4_duty;
				break;
			case 4:
				unit_period=unit5_period;
				unit_duty=unit5_duty;
				repeat_time=unit5_time;
				sub_period=sub5_period;
				sub_duty=sub5_duty;
				break;	
			case 5:
				unit_period = unit6_period;
				unit_duty = unit6_duty;
				repeat_time = unit6_time;
				sub_period = sub6_period;
				sub_duty = sub6_duty;
				break;	
			case 6:
				unit_period = unit7_period;
				unit_duty = unit7_duty;
				repeat_time = unit7_time;
				sub_period = sub7_period;
				sub_duty = sub7_duty;
				break;	
			case 7:
				unit_period = unit8_period;
				unit_duty = unit8_duty;
				repeat_time = unit8_time;
				sub_period = sub8_period;
				sub_duty = sub8_duty;
				break;		
			case 8:
				unit_period = unit9_period;
				unit_duty = unit9_duty;
				repeat_time = unit9_time;
				sub_period = sub9_period;
				sub_duty = sub9_duty;
				break;
			case 9:
				unit_period = unit10_period;
				unit_duty = unit10_duty;
				repeat_time = unit10_time;
				sub_period = sub10_period;
				sub_duty = sub10_duty;
				break;		
			case 10:
				unit_period = unit11_period;
				unit_duty = unit11_duty;
				repeat_time = unit11_time;
				sub_period = sub11_period;
				sub_duty = sub11_duty;
				break;
			default:
				break;
		}

		period_cnt++;
		if(period_cnt > unit_period){
			period_cnt = 0;
			period_cnt1++;
			if(period_cnt1 > repeat_time){
					period_cnt1 = 0;
					phase_cnt++;
					if(phase_cnt > phase_time){
						phase_cnt=0;
						// 模式2，3, 4 第一次循环和后续循环，波形不一样，在这里做标记
					
						switch(Work_Mode){
							case 1:
							// case 2: 
							// case 3: 
								mode2_first_loop_flag = 0;
								mode3_first_loop_flag = 0;
								mode4_first_loop_flag = 0;
								combo_waves_repeat_cnt = 0;
								break;
							case 2:  
								mode2_first_loop_flag = 1;
								combo_waves_repeat_cnt = 0;
							
								break;
							case 3:
								mode3_first_loop_flag = 1;
								combo_waves_repeat_cnt = 0;
								
								break;
							case 4:
								if(load_f){
									if(mode4_first_loop_flag == 0){
										combo_waves_repeat_cnt ++;
										if(combo_waves_repeat_cnt > 3){
											combo_waves_repeat_cnt = 0;
											mode4_first_loop_flag = 1;
											phase_cnt = 2;
											phase_time = 10;
										}
									}
									else{
										combo_waves_repeat_cnt ++;
										if(combo_waves_repeat_cnt > 3){
											phase_cnt = 2;
											combo_waves_repeat_cnt = 0;
										}else{
											phase_cnt = 9;
											phase_time = 10;
										}
									}	
								}
								printf("MODE4_WAVES_SELECT=[%d]\r\n", MODE4_WAVES_SELECT);
								printf("phase_time: [%d], phase_cnt:[%d]\r\n",phase_time, phase_cnt);
								break;	
							default: break;
						}
					}
				#if(MAX_WAVES_CNT == ALL_MODE_WAVES_SELECT)
					printf("all mode use waves 4 \r\n");
				#endif
			}
		}
		else if(period_cnt > unit_duty){
			ems_f = 0;
		}
		else
		{
			if(period_cnt < sub_duty){
				ems_f = 0;
			}
			else{
				ems_f = 1;
			}
			
		}


		//---------ems 输出 50ms之后，再进行负载检测判断
		if(ems_f && (period_cnt > 5)){
			AD_Result = (uint32_t)ADC_Convert(EMS_ISEN_Channel);
			EMS_LOAD_V = AD_Result*3.0f/1024;
			if(EMS_LOAD_V < 2.75f){		// 应为脉宽或电压调整，负载检查电压修改
				if(load_cnt < 200){
					load_cnt++;
				}
				if(load_cnt > 5){
					load_f = 1;
					unload_cnt = 0;
				}
			}
			else{
				// 防止 间隔几百ms，只出现3次的脉冲干扰检测，所以ems持续输出500s以上时，才进行负载检测
				if((load_f == 1)&&((sub_period >= 15*8)&&(sub_period <= 60*8)&&(period_cnt > 50)&&(unit_duty >= 50))){
					unload_cnt ++;
					if(unload_cnt == 5){
						load_cnt = 0;
					}
					if(unload_cnt > 10){
						load_f = 0;
					}
				}
				
			}
		}
		// if(Work_Mode == 4){
		// 	load_f = 1; // debug --时开启
		// }
		// load_f = 0;	// debug
		if(ems_f){
			// PWM_Driver(PWM_Channel, PWM_FREQ, 82);		//固定占空比
			// PWM_Driver(PWM_Channel, PWM_FREQ, 55);		//固定占空比
			// GPIO_PB04_AF_ATIM3_CH2B_SET();
			// GPIO_PB01_AF_ATIM3_CH1B_SET();
			PWM_Driver(PWM_Channel, PWM_FREQ, vems_pwm_duty[Work_Strength]);
		}
		else{
			GPIO_PB04_AF_GPIO_SET();	// 如果不关闭pwm的话，升压会一直持续，但是下次开启的瞬间，会有一个很高的脉刺出现
			GPIO_PB01_AF_GPIO_SET();
		}
			
	}

	if(Work_Mode == 0)
	{
			// EN_EMS_OFF;
			ems_f=0;
			EMS1_PWM_N_OFF;
			EMS1_PWM_P_OFF;
			EMS2_PWM_N_OFF;
			EMS2_PWM_P_OFF;
			Work_Strength=0;
			time_cnt=0;
			Ems_Duty=0;
			PWM_Driver(PWM_Channel,PWM_FREQ,Ems_Duty);
	}		
}


/*****************************
 * 蜂鸣器处理任务
 * 10ms 任务
 *****************************/
void Beep_Handler()
{
	if(Beep_Time){
		beep_cnt++;
		if(beep_cnt > 14){
			beep_cnt = 0;
			if(Beep_Time){
				Beep_Time--;
			}
		}
		else if(beep_cnt > 8){
			beep_f = 0;
		}
		else if(beep_cnt > 0)
		{
			beep_f=1;
		}
	}
	else{
		beep_cnt = 0;
		beep_f = 0;
		BUZZER_OFF;
	}
}




